package api

import (
	"fmt"
	"gin_session/internal/domain/service"
	"gin_session/internal/utils"
	"net/http"
)
import "github.com/gin-gonic/gin"

// sessions 包
import "github.com/gin-contrib/sessions"
import "github.com/gin-contrib/sessions/cookie"

func Start() {

	fmt.Println("🎯🎯🎯启动服务...")

	r := gin.Default()

	// Session配置
	store := cookie.NewStore([]byte("secret-key"))
	store.Options(sessions.Options{
		//MaxAge: int(30 * time.Minute / time.Second), // 30分钟
		MaxAge: 5, // 5秒
		Path:   "/",
	})
	r.Use(sessions.Sessions("auth-session", store))

	// 路由
	r.GET("/login", func(c *gin.Context) {
		// 获取操作session单例实例绑定到当前请求
		sessionCtx := utils.GetSessionUtil().Use(c)

		var userName string = c.Query("userName")
		var passWord string = c.Query("passWord")

		sysUserService := service.NewSysUserService()

		if flag, err := sysUserService.Login(userName, passWord); err != nil || flag == false {
			c.JSON(500, gin.H{"message": err.Error()})
			return
		}

		v := sessionCtx.GetString(userName)
		if v == "" {
			// 不存在session
			k, err := sessionCtx.SetKey(userName)
			if err != nil {
				c.JSON(500, gin.H{"message": err.Error()})
			}

			c.JSON(200, gin.H{"message": "success1", "data": k})
			return
		}

		c.JSON(200, gin.H{"message": "success2", "data": v})
	})

	// 获取所有在线的用户
	r.GET("/session", func(c *gin.Context) {
		sessionCtx := utils.GetSessionUtil().Use(c)
		c.JSON(200, gin.H{"message": "success", "data": sessionCtx.GetAll()})
	})

	// 受保护的路由
	// 请求头中要携带参数：auth_session
	auth := r.Group("/")
	auth.Use(AuthMiddleware())
	{
		auth.GET("/test1", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"message": "test1"})
		})

		auth.GET("/test2", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"message": "test2"})
		})

	}

	// 启动
	r.Run(":60000")

}

// 验证登录状态中间件
func AuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求headers中获取参数：auth_cookie
		authSession := c.GetHeader("auth_session")
		if authSession == "" {
			c.JSON(401, gin.H{"message": "未登录!"})
			c.Abort() // 立即中断请求处理链
			return
		}

		sessionCtx := utils.GetSessionUtil().Use(c)
		// 验证 session 有效性
		if err := sessionCtx.CheckAll(authSession); err != nil {
			c.JSON(401, gin.H{"message": err.Error()})
			c.Abort()
			return
		}

		// 将用户信息存储到上下文
		//c.Set("user_id", getUserIDBySession(sessionID))
		c.Next()
	}
}
